<?xml version="1.0" encoding="UTF-8"?>
<html>
    <head>
        <link type="text/css" rel="stylesheet" href="./css/template.css" />
        <link type="text/css" rel="stylesheet" href="./css/SyntaxHighlighter.css" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Les web services en J2EE</title>
        <script language="javascript" src="./js/shInit.js" />
        <script language="javascript" src="./js/shCore.js" />
        <script language="javascript" src="./js/shBrushCpp.js" />
        <script language="javascript" src="./js/shBrushCSharp.js" />
        <script language="javascript" src="./js/shBrushCss.js" />
        <script language="javascript" src="./js/shBrushDelphi.js" />
        <script language="javascript" src="./js/shBrushJava.js" />
        <script language="javascript" src="./js/shBrushJScript.js" />
        <script language="javascript" src="./js/shBrushPhp.js" />
        <script language="javascript" src="./js/shBrushPython.js" />
        <script language="javascript" src="./js/shBrushRuby.js" />
        <script language="javascript" src="./js/shBrushSql.js" />
        <script language="javascript" src="./js/shBrushVb.js" />
        <script language="javascript" src="./js/shBrushXml.js" />
        <keywords>J2EE,web-service,SOAP,axis</keywords>
        <keywords />
        <author>Yohann JOUANNEAU</author>
    </head>
    <body>
        <div class="chapter">
            <h2>Introduction</h2>
            <p>Cet article présente les web-services en JAVA à travers différents chapitres :</p>
            <p>
                - Qu'est ce qu'un web service ? :
                <i>Présentation et utilité</i>
            </p>
            <p>
                - Principe de fonctionnement :
                <i>Protocole de communication et types de fichier utilisé.</i>
            </p>
            <p>
                - Installation d'Axis :
                <i>Notes et lien vers la documentation, déploiement et retrait de web services.</i>
            </p>
            <p>
                - Création sous Eclipse :
                <i>Tutoriaux sur la création de web services et d'applications clientes</i>
            </p>
            <p>
                - (Annexe) Technologie Sun et Apache autour des web services :
                <i>Liens vers des ressources</i>
            </p>
            <p>Bonne lecture !</p>
        </div>
        <div class="chapter">
            <h2>Qu'est-ce-qu'un web service ?</h2>
            <div class="subChapter">
                <h3>Présentation</h3>
                <p>Un web service est une application situer sur un serveur, qui execute un traitement précis. Une application distante ( Lan ou internet) contacte le Web service et lui demande d'exécuté un traitement précis, ce dernier lui renvoit le résultat, elle peu ainsi mettre la réponse à disposition de l'utilisateur.</p>
                <img src="./images/WS_desc.jpg" />
                <p>
                    <i>Fonctionnement général d'un web service.</i>
                </p>
                <p>
                    Cette technologie initialement lancé par Microsoft et IBM, permet une très grande
                    <b>inter-opérabilité</b>
                    . Une application developpée en JAVA peut par exemple faire appelle à un web service implémenté en .NET, et cela sans se soucier de la platforme de l'application (ordinateur de bureau,PDA, téléphone portable...).
                </p>
                <p>
                    La compatibilité entre tous est due à l'utilisation par les web services d'un protocole de communication proche du XML ( compréhensible par beaucoup de langage ) le
                    <b>SOAP</b>
                    (notion abordée en détail dans le prochain chapitre).
                </p>
            </div>
            <!-- Fin du sous chapitre présentation  -->
            <div class="subChapter">
                <h3>Utilisation courante</h3>
                <p>
                    On utilise souvent des web services, parfois même sans s'en rendre compte, en effet, c'est le principe de fonctionnement de beaucoup de widget ( sur le web ou sur votre système d'exploitation ). Souvent ce genre d'application utilise des web services par l'intermédiaire de services d'annuaires
                    <b>UDDI</b>
                    qui répertorient les web services du web et fournissent la description de leurs fonctionnalités (qu'on appellera
                    <b>opérations du web service</b>
                    ) au format
                    <b>WSDL</b>
                    ( nous verrons les notions de UDDI et WSDL plus en détail dans le chapitre suivant ).
                </p>
                <img src="./images/Clock_dash.png" />
                &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp
                <img src="./images/Meteo_vista.png" />
                <p>
                    <i>widget Clock sous MacOS X &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp widget Meteo sous WIndows Vista</i>
                </p>
            </div>
            <!-- Fin du sous chapitre utilité  -->
        </div>
        <!-- Fin du chapitre Qu'est ce qu'un WebService -->
        <div class="chapter">
            <h2>Principe de fonctionnement</h2>
            <div class="subChapter">
                <h3>Un protocole de communication : le SOAP</h3>
                <h4>Description</h4>
                <p>Le SOAP (Simple Objetct Access Protocol) est un protocole qui transmet les informations entre l'application cliente et le web service, en XML, ce qui permet la grande flexibilité concernant les langages utilisés pour conçevoir les clients et les web services.</p>
                <p>
                    SOAP est utilisé à la fois pour l'envoie de message (
                    <b>SOAP messaging</b>
                    ) et l'appel de méthode (
                    <b>SOAP RPC</b>
                    ).
                </p>
                <h4>Strucure d'un message SOAP</h4>
                <img src="./images/Soap.png" />
                <p>
                    L'élément le plus intéressant dans un message SOAP est la section
                    <b>Envelope</b>
                    qui se divise en deux partie :
                </p>
                <p>
                    -
                    <b>Header</b>
                    : un message SOAP peut passer par plusieurs application avant d'être traité par l'application finale, l'attribut
                    <b>actor</b>
                    précise par ou le message peut passer, l'attribut
                    <b>mustUnderstand</b>
                    indique si oui ou non le message doit passer par un acteur (balise
                    <b>actor</b>
                    ).
                </p>
                <p>
                    <b>Note :</b>
                    La balise
                    <b>Header</b>
                    n'est pas obligatoire, car en l'absence de la balise
                    <b>actor</b>
                    la première application qui reçoit le message est considérée comme finale ( c'est elle qui va se servir des données).
                </p>
                <p>
                    -
                    <b>Body</b>
                    : Cette balise est obligatoire et très importante, c'est elle qui définie le nom de l'opération du web service à appeler ainsi que le nom et la valeur des paramètres qui vont lui être transmis.
                </p>
                <h4>La transmission par HTTP</h4>
                <p>
                    Toujours dans un soucis d'inter-opérabilité, les messages SOAP sont transmis via HTTP, la requête HTTP doit comporter le champs d'en-tête
                    <b>SOAPAction</b>
                    pour être assimilé au protocole SOAP.
                </p>
                <p>
                    Ci dessous voici un exemple du contenu XML de la balise
                    <b>body</b>
                    du message SOAP transmis via HTTP :
                </p>
                <p>
                    <b>La requête du client :</b>
                </p>
                <textarea name="code" class="xml">
                    &lt;?xml version="1.0" encoding="UTF-8"?&gt;
                    <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                        <soapenv:body>
                            <tosquare xmlns="http://services">
                                <x>3</x>
                            </tosquare>
                        </soapenv:body>
                    </soapenv:envelope>
                </textarea>
                <p>
                    <i>
                        l'opération
                        <b>toSquare</b>
                        est appellée, le paramètre
                        <b>x</b>
                        est égale à
                        <b>3</b>
                        .
                    </i>
                </p>
                <p>
                    <b>La réponse du serveur :</b>
                </p>
                <textarea name="code" class="xml">
                    &lt;?xml version="1.0" encoding="utf-8"?&gt;
                    <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                        <soapenv:body>
                            <tosquareresponse xmlns="http://services">
                                <tosquarereturn>9</tosquarereturn>
                            </tosquareresponse>
                        </soapenv:body>
                    </soapenv:envelope>
                </textarea>
                <p>
                    <i>
                        la réponse du web service à l'opération
                        <b>toSquare</b>
                    </i>
                </p>
                <p>
                    <b>Note :</b>
                    <a href="http://www.w3schools.com/soap/default.asp" target="_about">Tutorial SOAP sur w3schools</a>
                </p>
            </div>
            <!-- fin de sous chapitre protocole de comm -->
            <div class="subChapter">
                <h3>Le descripteur de web service : le fichier WSLD</h3>
                <h4>Définition</h4>
                <p>Le fichier WSDL (Web Service Description Language) permet de connaitre les différentes opérations réalisable par un web service en lui envoyant un message SOAP. On peut ainsi connaitre le nom de l'opération ainsi que les noms/valeurs des paramètres à lui passer. Les fichiers WSDL permettent d'utiliser des web services disponible sur internet, de connaître leur mode de fonctionnement et ainsi de les intégrer dans sa propre application.</p>
                <p>Les fichiers WSDL ont une syntaxe proche du XML, il peuvent être lus par un grand nombre de langage et permettent la génération automatique d'application consomatrice de web service.</p>
                <h4>La structure d'un fichier WSDL</h4>
                <p>
                    Voici un exemple commenté d'un fichier WSDL pour le web service
                    <b>MathServices</b>
                    :
                </p>
                <textarea name="code" class="xml">
                    En-tête de début de fichier :
                    <definition>
                        Définitions des élément qui vont composés
						le message soap (opération, paramètres,nom du retour)
                        <element name="toSquare">
                            <complextype>
                                <sequence>
                                    Précise le nom et le type quand il s'agit d'un
									parametre ou d'une valeur de retour
									x est paramètre de toSquare il est de type entier :
                                    <element name="x" type="xsd:int" />
                                </sequence>
                            </complextype>
                        </element>
                        La réponse a toSquare retourne un entier qui a
						comme nom toSquareReturn :
                        <element name="toSquareResponse">
                            <complextype>
                                <sequence>
                                    <element name="toSquareReturn" type="xsd:int" />
                                </sequence>
                            </complextype>
                        </element>
                        ...
						Les messages : il définissent le type de message qui vont être
						transmis lors des requêtes SOAP
						Par exemple, le message suivant signifie que
						toCubeRequest est utilisé comme balise dans le message SOAP pour passer
						une valeur à l'opération toCube :
                        <wsdl:message xmlns:wsdl="wsdl" name="toCubeRequest">
                            <wsdl:part element="impl:toCube" name="parameters" />
                        </wsdl:message>
                        <wsdl:message xmlns:wsdl="wsdl" name="toCubeResponse">
                            <wsdl:part element="impl:toCubeResponse" name="parameters" />
                        </wsdl:message>
                        ...
						La balise portType informe sur le fonctionnement des opérations
						du web service
						Ici on a des information sur les opérations de MathServices :
                        <wsdl:porttype xmlns:wsdl="wsdl" name="MathServices">
                            Il possède une opération toSquare qui prend comme
							paramètre toSquareRequest et retourne toSquareResponse dont
							les types est définis plus haut dans les balises
                            <element>
                                :
                                <wsdl:operation name="toSquare">
                                    <wsdl:input message="impl:toSquareRequest" name="toSquareRequest" />
                                    <wsdl:output message="impl:toSquareResponse" name="toSquareResponse" />
                                </wsdl:operation>
                                ...
								Même démarche pour les autres opérations
                            </element>
                        </wsdl:porttype>
                        La balise binding définit un protocole de communication
						pour le web service et associe un format de donnée
						pour chaque opération de
                        <porttype>
                            <wsdl:binding xmlns:wsdl="wsdl" name="MathServicesSoapBinding" type="impl:MathServices">
                                <wsdlsoap:binding xmlns:wsdlsoap="wsdlsoap" style="document" transport="http://schemas.xmlsoap.org/soap/http" />
                                <wsdl:operation name="toSquare">
                                    <wsdlsoap:operation xmlns:wsdlsoap="wsdlsoap" soapaction="" />
                                    <wsdl:input name="toSquareRequest">
                                        <wsdlsoap:body xmlns:wsdlsoap="wsdlsoap" use="literal" />
                                    </wsdl:input>
                                    <wsdl:output name="toSquareResponse">
                                        <wsdlsoap:body xmlns:wsdlsoap="wsdlsoap" use="literal" />
                                    </wsdl:output>
                                </wsdl:operation>
                                ...
								Idem pour les autres opérations du web service.
                            </wsdl:binding>
                            <wsdl:service xmlns:wsdl="wsdl" name="MathServicesService">
                                La balise
                                <port>
                                    fait la liaison entre l'addresse du web-service
									sur le serveur et la balise
                                    <binding>
                                        ci-dessus
                                        <wsdl:port binding="impl:MathServicesSoapBinding" name="MathServices">
                                            <wsdlsoap:address xmlns:wsdlsoap="wsdlsoap" location="http://localhost:8080/WebServiceTest2/services/MathServices" />
                                        </wsdl:port>
                                    </binding>
                                </port>
                            </wsdl:service>
                        </porttype>
                    </definition>
                </textarea>
            </div>
            <!-- fin du sous chapitre WSDL -->
            <div class="subChapter">
                <h3>Le service d'annuaire UDDI</h3>
                <p>Le service d'annuaire UDDI (Universal Description, Discovery and Integration) permet à la fois de rechercher les web services disponibles sur le web mais aussi d'en publier.</p>
                <p>Pour enregistrer un web service, les entreprises créer un fichier, le business registery, qui doit respecter les normes UDDI, la syntaxe de ce fichier est une fois encore proche du XML.</p>
                <p>Les annuaires sont des services privés sur le web et destinés particulèrement aux échanges Business to Business (B2B). Ils fournissent des informations sur les web services (WSDL) mais aussi des détails sur les entreprise qui les développent (nouveau produit, page d'accueil...)</p>
                <p>Les services d'annuaire UDDI répertorient les web services présents sur les serveurs du monde entier, d'où la notion d'universel. Ils permettent de classer, gérer et rechercher tout ces web services ; comme tout est centralisé, le flux d'accés aux web services est maitrisé, ce qui est primordial car s'il y a trop d'accés à un web services il devient lent et donc inutile.</p>
                <h4>L'API UDDI</h4>
                <p>L'API du service d'annuaire se divise en deux catégories, une qui regroupe les fonctions de recherche de web service et la seconde qui est plus axée sur la publication de nouveaux web service</p>
                <p>
                    <b>Note :</b>
                    le langage utilisé pour développer en UDDI est XML
                </p>
                <p>
                    <b>Les fonctionnalités de recherche :</b>
                </p>
                <p>Les requête sont généralement fait par l'intermédiaire du moteur de recherche intégré au site qui vous fournit les services UDDI, de cette façon, les opérateurs UDDI vous assurent la sécurité et l'intégrité des web services trouvés.</p>
                <p>Selon les critères de recherche, les opérateurs UDDI vous renvoit différents types de données, en voici des exemples :</p>
                <p>
                    <b>Note</b>
                    : il est possible pour bon nombre de requêtes, de spécifier des paramètres pour gérer les résultats : le nombre de ligne maximum à affiché, le tri par ordre alphabétique...
                </p>
                <p>
                    -
                    <b>&lt;find_business&gt;</b>
                    : cette balise permet de trouver la/les entreprise(s) pour un web service donné selon différents critères passer en arguments.
                </p>
                <p>
                    -
                    <b>&lt;find_service&gt;</b>
                    :  cette balise permet d'obtenir la définition d'un ou plusieurs services par leurs noms ou la catégorie auxquels ils appartiennent.
                </p>
                <p>
                    -
                    <b>&lt;find_relatedBusinesses&gt;</b>
                    : récupère la liste des entreprise lié à une autre entreprise par l'intermédiaire de sa
                    <i>businessKey</i>
                    ( filiale, partenaire... )
                </p>
                <p>
                    -
                    <b>&lt;find_binding&gt;</b>
                    : récupère la liaison ( adresse IP, nom de domaine ... ) pour avoir accés à un service donné.
                </p>
                <p>
                    <b>Les fonctionnalités de publication :</b>
                </p>
                <p>Lorsque qu'on souhaite publier un web service, de la même façon que dans le fichier WSDL, il est important de fournir les données de liaisons ( addresse, protocole, fonctionnalité du web service ...) pour y accéder.</p>
                <p>Lors de la publication du web service, l'entreprise doit s'authentifier auprès de l'opérateur UDDI, elle à la possibilité d'enregistrer ses filiales ou ses partenaires lors d'une même publication.</p>
                <p>Si le web service déposé nécessite une mise à jour ou une modification, l'entreprise va faire appelle au même opérateur.</p>
                <p>On distingue trois type de commande disponible dans l'API</p>
                <p>
                    <b>L'ajout et le retrait de web service</b>
                    : les balises de type
                    <b>save</b>
                    et
                    <b>delete</b>
                    permettent d'ajouter/supprimer les web service ou les informations associées ( nom de l'entreprise/partenaire, données de liaison ...).
                </p>
                <p>
                    <b>L'authentification</b>
                    : La balise
                    <b>get_authToken</b>
                    et
                    <b>set_authToken</b>
                    pour sécurisé l'accés aux données d'une entreprise qui publie ( utilisé par exemple pour les assertions entre deux entreprises ).
                </p>
                <p>
                    <b>L'ajout d'entreprise</b>
                    : ajout des partenaire ou filiale qui publie le web service.
                </p>
                <p>
                    <b>Note</b>
                    :
                    <a href="http://www.uddi.org/pubs/ProgrammersAPI-V2.04-Published-20020719.htm" target="_about">lien vers l'API UDDI</a>
                </p>
            </div>
            <!-- Fin de sous chapitre annuaire UDDI -->
        </div>
        <!-- Fin du chapitre Principe de fonctionnement  -->
        <div class="chapter">
            <h2>Apache AXIS : il SOAP vos web service ;)</h2>
            <img src="./images/axis.jpg" />
            <p>Pour fonctionner un web service doit être déployer sur un serveur d'application. Précédement nous avons vu que les WS pouvaient être heberger sur les serveurs des opérateurs UDDI, mais dans un cadre privé par exemple dans le LAN d'une entreprise, il est tout a fait possible de mettre en place son propre serveur pour y déployer ses WS.</p>
            <p>
                <b>Note : Pour cet article le serveur d'applications utilisé est Tomcat</b>
            </p>
            <p>Nous allons maintenant présenter ce qu'est AXIS et voir comment il permet la mise en place d'un web service sur un serveur :</p>
            <div class="subChapter">
                <h3>Présentation</h3>
                <p>Axis est en fait une implémentation du protocol SOAP developpé en JAVA par Apache (il existe une version C++, mais JAVA c'est mieux ;) ). Il se rajoute sur un serveur d'applications web et offre des fonctionnalitées pour créer et déployer des web services. (WSDL2Java et JWS entre autres, mais nous verrons cela par la suite)</p>
                <p />
            </div>
            <!-- fin du sous chapitre présentation d'AXIS -->
            <div class="subChapter">
                <h3>L'installation du serveur AXIS</h3>
                <p>
                    Une fois l'archive télécharger (
                    <a href="http://www.apache.org/dyn/closer.cgi/ws/axis/1_4" target="_about">Téléchargement d'axis 1.4</a>
                    ) copier le répertoire
                    <b>[rep_axis]/webapps/axis</b>
                    dans le repertoire
                    <b>[rep_tomcat]/webapps/</b>
                    de tomcat.
                </p>
                <p>
                    Rajouter les librairies
                    <b>activation.jar</b>
                    (
                    <a href="http://java.sun.com/products/javabeans/jaf/downloads/index.html" target="_about">activation.jar</a>
                    est obligatoire) et
                    <b>mail.jar</b>
                    (
                    <a href="http://java.sun.com/products/javamail/downloads/index.html" target="_about">mail.jar</a>
                    est facultative) dans le répertoire
                    <b>libs</b>
                    de Tomcat.
                </p>
                <p>
                    <b>Note : Selon votre version de Tomcat, vous aurez peu être besoin de rajouter un parseur XML dans le répertoire libs</b>
                </p>
                <p>
                    Axis devrait être déployer automatiquement par Tomcat, pour tester le bon fonctionnement d'AXIS, redémarer le serveur tomacat et rendez vous à la page
                    <a href="http://localhost:8080/axis" target="_about">http://localhost:8080/axis</a>
                    :
                </p>
                <img src="./images/axisHome.png" />
                <p>
                    <i>
                        Page d'acceuil Axis sur votre serveur Tomcat, cliquez sur le lien
                        <b>Activation</b>
                    </i>
                </p>
                <p>
                    <b>Note : vous n'aurez pas cette page si vous tentez d'y accéder par le navigateur intégré à eclipse europa après qu'il ai démarrer le serveur, mais axis fonctionne tout de même. Pour avoir la page il faut absolument lancer Tomcat à la main.</b>
                </p>
                <p>
                    Une fois le lien
                    <i>Activation</i>
                    cliqué, cette page vous permet de voir les librairies installés et manquante :
                </p>
                <img src="./images/activationAxis.png" />
                <p>
                    <i>Liste des librairies intallées, encadrée en rouge celle manquante ( ici mail.jar)</i>
                </p>
            </div>
            <!-- Fin du sous chapitre install axis -->
            <div class="subChapter">
                <h3>Déploiment et retrait de web service</h3>
                <p>Axis utilise des descripteur, qui sont en fait des fichiers XML, pour déployer ou retirer les fichiers XML. Soit on les rédige à la main, soit ils sont générés via WSDL par un IDE tel qu'Eclipse.</p>
                <h4>
                    Le fichier
                    <i>deploy.wsdd</i>
                </h4>
                <p>
                    Voici un exemple commenté du descripteur de déploiment du web-service
                    <i>HelloWorld</i>
                    :
                </p>
                <textarea name="code" class="xml">
                    &lt;?xml version="1.0" encoding="UTF-8"?&gt;
                    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
                        <!-- Services from HelloWorldService WSDL service -->
                        le nom du web-service et la méthode d'appel des opération, ici SOAP RPC:
                        <service name="HelloWorld" provider="java:RPC" style="wrapped" use="literal">
                            <parameter name="wsdlTargetNamespace" value="http://services" />
                            nom du dossier dans lequel se trouve le web-service:
                            <parameter name="wsdlServiceElement" value="HelloWorldService" />
                            <parameter name="schemaQualified" value="http://services" />
                            <parameter name="wsdlServicePort" value="HelloWorld" />
                            nom de la classe java qui fera les traitement du web-service:
                            <parameter name="className" value="services.HelloWorld" />
                            Les infos suivantes sont récupérées dans la section portType du WSDL :
                            <parameter name="wsdlPortType" value="HelloWorld" />
                            <parameter name="typeMappingVersion" value="1.2" />
                            nom et détail des opérations du web service :
                            <operation xmlns:operns="http://services" xmlns:retns="http://services" xmlns:rtns="http://www.w3.org/2001/XMLSchema" name="sayHello" qname="operNS:sayHello" returnqname="retNS:sayHelloReturn" returntype="rtns:string" soapaction="" />
                            <operation xmlns:operns="http://services" xmlns:retns="http://services" xmlns:rtns="http://www.w3.org/2001/XMLSchema" name="sayCool" qname="operNS:sayCool" returnqname="retNS:sayCoolReturn" returntype="rtns:string" soapaction="" />
                            opération qui seront accessible à l'utilisateur :
                            <parameter name="allowedMethods" value="sayCool sayHello" />
                        </service>
                    </deployment>
                </textarea>
                <p>
                    <i>Fichier deploy.wsdd généré via WSDL donc se basant sur les balises de celui-ci.</i>
                </p>
                <h4>Le fichier undeploy.wsdd</h4>
                <p>Comme son nom l'indique ce fichier sert à retirer le web service, sa syntaxe est beacoup plus simple :</p>
                <textarea name="code" class="xml">
                    <undeployment>
                        xmlns="http://xml.apache.org/axis/wsdd/"&gt;
                        <!-- Services from HelloWorldService WSDL service -->
                        <service name="HelloWorld" />
                    </undeployment>
                </textarea>
                <p>
                    <i>Descripteur de retrait du HelloWorld généré via WSDL.</i>
                </p>
                <p>
                    <b>
                        Note : il est possible de mettre en place un web service en ligne de commande et dans ce cas de se servir des descripteurs WSDD ( écrit à la main ) vous trouverez plus d'informations sur
                        <a href="http://ws.apache.org/axis/java/install.html" target="_about">le manuel d'installation</a>
                        et
                        <a href="http://ws.apache.org/axis/java/user-guide.html" target="_about">le manuel d'utilisation</a>
                        d'Axis
                    </b>
                    .
                </p>
            </div>
            <!-- fin de déploiement des WS -->
        </div>
        <!-- fin du chapitre serveur AXIS -->
        <div class="chapter">
            <h2>Methode de mise en place de web service sous Eclipse</h2>
            <img src="./images/eclipse.jpg" />
            <div class="subChapter">
                <h3>Création et mise en place d'un web-service</h3>
                <h4>Création à partir d'une classe JAVA</h4>
                <p>
                    Dans un nouveau projet web dynamique (Dans notre cas
                    <i>WebServiceTest</i>
                    ), on crée une class HelloWorld qui contiendra
					deux méthodes qui seront les deux opérations disponibles pour le web service :
                </p>
                <textarea name="code" class="java">package services;
					public class HelloWorld{
					public String sayHello() {
					return "Hello I'm a web service";
					}
					public String sayGoodBye(){
					return "Cool it Works  !! ";
					}
					}</textarea>
                <img src="./images/createWSeclipse.png" />
                <p>
                    <i>La création se fait par un clic droit sur la classe.</i>
                </p>
                <img src="./images/createWSwindow.png" />
                <p>
                    <i>Laisser les options par défaut et cliquez sur Finish.</i>
                </p>
                <img src="./images/arboWSdeploy.png" />
                <p>
                    <i>Arborescence après création du web service.</i>
                </p>
                <p>Eclipse crée les fichiers suivants dans le répertoire WEB-INF :</p>
                <p>
                    -
                    <i>
                        <b>deploy.wssd</b>
                    </i>
                    : fichier de déploiement du web-service.
                </p>
                <p />
                <p />
                -
                <i>
                    <b>deploy.wsdd.bak</b>
                </i>
                : sauvegarde crée automatiquement si on change le nom de la classe.
                <p />
                -
                <i>
                    <b>undeploy.wsdd</b>
                </i>
                : retire le web service du serveur axis.
                <p />
                <p>
                    -
                    <i>
                        <b>server-config.wsdd</b>
                    </i>
                    : le fichier de configuration du serveur axis.
                </p>
                <p>
                    -
                    <i>
                        <b>HelloWorld.wsdl</b>
                    </i>
                    : descripteur du web service HelloWorld.
                </p>
                <h4>Vérification et test des fonctionnalités</h4>
                <p>Ce lien vous permet de voir tous les web services présents sur le serveur axis :</p>
                <a href="http://localhost:8080/WevServiceTest/services" target="_about">http://localhost:8080/WevServiceTest/services</a>
                <img src="./images/axisWSlist.png" />
                <p>
                    <i>Le service HelloWorld est bien présent dans la liste</i>
                </p>
                <p />
                <p>Ce lien vous permet de consulter le descripteur de service HelloWorld.wsdl :</p>
                <a href="http://localhost:8080/WevServiceTest/services/HelloWorld?wsdl" target="_about">http://localhost:8080/WevServiceTest/services/HelloWorld?wsdl</a>
                <img src="./images/wsdlHello.png" />
                <p>
                    <i>Il y a bien les deux opérations (méthodes de la classe) sayHello() et sayCool()</i>
                </p>
                <p>Ce lien vous permet d'appeller une opération du web service :</p>
                <a href="http://localhost:8080/WevServiceTest/services/HelloWorld?method=sayHello" target="_about">http://localhost:8080/WevServiceTest/services/HelloWorld?method=sayHello</a>
                <textarea name="code" class="xml">
                    <soapenv:envelope xmlns:soapenv="soapenv">
                        <soapenv:body>
                            <sayhelloresponse>
                                <ns1:sayhelloreturn xmlns:ns1="ns1">Hello I'm web Service</ns1:sayhelloreturn>
                            </sayhelloresponse>
                        </soapenv:body>
                    </soapenv:envelope>
                </textarea>
                <p>
                    <i>La réponse Soap correspond bien au retour de la méthode sayHello() de la classe JAVA</i>
                </p>
                <div>
                    <!-- fin du sous chapitre création classe JAVA -->
                    <div class="subChapter">
                        <h3>Ajout et retrait d'un web service</h3>
                        <h4>Le JWS (Java Web Service)</h4>
                        <p>Le JWS est un standard supporté par la JCP ( Java Community Process ) qui à pour but de faciliter le déploiement et le retrait d'un web service. Axis se base sur JWS pour offrir une mise en place et une utilisation plus simple des web services.</p>
                        <p>
                            <b>Le Déploiement :</b>
                        </p>
                        <p>
                            Il faut Copier/Coller la classe JAVA ( ici HelloWorld.java ) dans un fichier situer dans le répertoire WebContent qui portera le nom :
                            <i>nom_de_la_classe.jws</i>
                            .
                        </p>
                        <img src="./images/fileJWS.png" />
                        <p>En cliquant sur ce lien ( qui fait référence directement au fichier tout juste crée ), on constate que le web service est bien présent sur le serveur axis.</p>
                        <p>
                            <a href="http://localhost:8080/WevServiceTest/HelloWorld.jws" target="_about">http://localhost:8080/WevServiceTest/HelloWorld.jws</a>
                            <img src="./images/axisJWS.png" />
                        </p>
                        <p>
                            <b>Descripteur du web service et appels d'opérations :</b>
                        </p>
                        <p>
                            De la même façon que précédemment ( par l'URL
                            <i>http://[nom_hote]/[nom_projet]/services/[nom_web_service]/[...]</i>
                            ), il est possible d'acceder au descripteur ( wsdl ) ainsi qu'aux opérations du web service.
                        </p>
                        <a href="http://localhost:8080/WevServiceTest/HelloWorld.jws?wsdl" target="_about">http://localhost:8080/WevServiceTest/HelloWorld.jws?wsdl</a>
                        <a href="http://localhost:8080/WevServiceTest/HelloWorld.jws?method=sayCool" target="_about">http://localhost:8080/WevServiceTest/HelloWorld.jws?method=sayCool</a>
                        <textarea name="code" class="xml">
                            <soapenv:envelope xmlns:soapenv="soapenv">
                                <soapenv:body>
                                    <saycoolresponse soapenv:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/">
                                        <saycoolreturn xmlns:xsi="xsi" xsi:type="xsd:string">Cool it Works  !!</saycoolreturn>
                                    </saycoolresponse>
                                </soapenv:body>
                            </soapenv:envelope>
                        </textarea>
                        <p>
                            <i>Accés à l'opération sayCool() du web service par la méthode JWS</i>
                        </p>
                        <p>
                            <b>Le retrait :</b>
                        </p>
                        <p>Pour retirer une opération du web service il faut supprimer la méthode dans le fichier .jws. Dans le cas présent, on enlève la méthode sayCool() et on rappelle l'opération :</p>
                        <a href="http://localhost:8080/WevServiceTest/HelloWorld.jws?method=sayCool" target="_about">http://localhost:8080/WevServiceTest/HelloWorld.jws?method=sayCool</a>
                        <textarea name="code" class="xml">
                            <soapenv:envelope xmlns:soapenv="soapenv">
                                <soapenv:body>
                                    <soapenv:fault>
                                        <faultcode>ns1:Client</faultcode>
                                        <faultstring>No such operation 'sayCool'</faultstring>
                                        <detail>
                                            <ns2:hostname xmlns:ns2="ns2">ordinateur-de-yohann.local</ns2:hostname>
                                        </detail>
                                    </soapenv:fault>
                                </soapenv:body>
                            </soapenv:envelope>
                        </textarea>
                        <p>
                            <i>Message Soap signifiant que l'opération sayCool n'est pas présente.</i>
                        </p>
                        <p>Pour supprimer l'accés au web service, il faut supprimer le fichier JWS :</p>
                        <a href="http://localhost:8080/WevServiceTest/HelloWorld.jws" target="_about">http://localhost:8080/WevServiceTest/HelloWorld.jws</a>
                        <textarea name="code" class="xml">
                            <soapenv:envelope xmlns:soapenv="soapenv">
                                <soapenv:body>
                                    <soapenv:fault>
                                        <faultcode>soapenv:Server.userException</faultcode>
                                        <faultstring>java.io.FileNotFoundException: /HelloWorld.jws</faultstring>
                                        <detail>
                                            <ns1:hostname xmlns:ns1="ns1">ordinateur-de-yohann.local</ns1:hostname>
                                        </detail>
                                    </soapenv:fault>
                                </soapenv:body>
                            </soapenv:envelope>
                        </textarea>
                        <p>
                            <i>Le web service n'est plus accessible car le fichier JWS n'existe plus.</i>
                        </p>
                        <h4>La méthode server-config.wsdd</h4>
                        <p>
                            Il est possible de rendre inaccessible une ou plusieurs opérations d'un web service en modifant le paramètre
                            <i>allowedMethods</i>
                            du fichier
                            <i>config-server.wsdd</i>
                            . Ce paramètre contient le noms des diverses opérations disponibles séparés par un espace, pour en supprimer l'accés, il faut effacer les opérations voulues. Dans notre cas, on supprime sayHello :
                        </p>
                        <img src="./images/unUseWSwsdd.png" />
                        <a href="http://localhost:8080/WevServiceTest/services/HelloWorld?method=sayHello" target="_about">http://localhost:8080/WevServiceTest/services/HelloWorld?method=sayHello</a>
                        <textarea name="code" class="xml">
                            <soapenv:envelope xmlns:soapenv="soapenv">
                                <soapenv:body>
                                    <soapenv:fault>
                                        <faultcode>soapenv:Server.userException</faultcode>
                                        <faultstring>org.apache.axis.InternalException: java.lang.Exception: Couldn't find a matcing Java operation for WSDD operation "sayHello" (0 args)</faultstring>
                                        <detail>
                                            <ns1:hostname xmlns:ns1="ns1">ordinateur-de-yohann.local</ns1:hostname>
                                        </detail>
                                    </soapenv:fault>
                                </soapenv:body>
                            </soapenv:envelope>
                        </textarea>
                        <p>
                            <i>Le serveur axis ne fait pas la correspondance entre l'opération appelée et les noms présent dans le fichier wsdd, l'opération sayHello n'est donc plus accessible.</i>
                        </p>
                    </div>
                    <!-- fin du sous chapitre ajout et retrait -->
                    <div class="subChapter">
                        <h3>Consommer un web service</h3>
                        <h4>Création d'un client JAVA</h4>
                        <p>
                            <b>
                                Création d'un web service
                                <i>MathServices</i>
                                :
                            </b>
                        </p>
                        <p>
                            On commence par créer un nouveau web service basé sur la classe JAVA ci-dessous de la même façon que précédemment. (Dans notre cas
                            <i>WebServiceTest2</i>
                            )
                        </p>
                        <p>
                            <textarea name="code" class="java">package services;
								public class MathServices  {
								public int toSquare(int x) {
								return x*x;
								}
								public int toCube(int x) {
								return x*x*x;
								}
								}</textarea>
                        </p>
                        <p>Pour vérifier la bonne création du web service, on observe le fichier wsdl :</p>
                        <img src="./images/wsdlMath.png" />
                        <p>
                            <i>MathServices.wsdl dans un navigateur web.</i>
                        </p>
                        <img src="./images/wsdlMathSchema.png" />
                        <p>
                            <i>MathServices.wsdl dans Eclipse.</i>
                        </p>
                        <p>
                            <b>
                                Note : Pour appeller une opération avec paramètre du web service, on utilise la propriété
                                <i>name</i>
                                de la balise
                                <i>input</i>
                                dans le fichier WSDL. (
                                <a href="http://localhost:8080/WebServiceTest2/services/MathServices?method=toSquare&amp;toSquareRequest=2" target="_about">http://localhost:8080/WebServiceTest2/services/MathServices?method=toSquare&amp;toSquareRequest=2</a>
                                )
                            </b>
                        </p>
                        <p>
                            <b>
                                Ajout de
                                <i>MathServices.wsdl</i>
                                dans l'application cliente :
                            </b>
                        </p>
                        <p>
                            On commence par créer un nouveau projet
                            <i>application JAVA</i>
                            , ensuite dans le répertoire
                            <i>src</i>
                            , on copie le fichier descripteur
                            <i>MathServices.wsdl</i>
                            (précédemment crée avec le web service).
                        </p>
                        <p>Pour créer un client, on fait un clic droit sur le fichier :</p>
                        <img src="./images/wsdlGenerateClient.png" />
                        <p>
                            <i>
                                Un clic sur
                                <i>Create client</i>
                                et l'assistant se lance.
                            </i>
                        </p>
                        <img src="./images/generateClientWindow.png" />
                        <p>
                            <i>Laisser les valeurs par défaut et cliquez sur Finish.</i>
                        </p>
                        <img src="./images/arboClient.png" />
                        <p>
                            <i>De nouvelles classes et interfaces se sont crées dans un package portant le même nom que celui dans lequel est le web services appellé .</i>
                        </p>
                        <p>
                            <b>L'utilitaire WSDL2Java :</b>
                        </p>
                        <p>
                            Dans la capture d'écran précédente, nous avons vu que la création d'un client entrainait la création de plusieurs classes et interfaces, c'est en fait un utilitaire d'Axis,
                            <b>WSDL2Java</b>
                            qui génère dans le but de faciliter et sécuriser la création du client.
                        </p>
                        <p>Les fichiers générés sont en rapport avec les paramétres présent dans le fichier WSDL du web service et en respect strictement la structure. Voyons plus en détail les différents objets crées et leurs fonctions :</p>
                        <p>
                            -
                            <i>
                                <b>nom_du_WS.java</b>
                            </i>
                            : interface qui correspond à la balise
                            <i>portType&gt;</i>
                            dans le WSDL et qui contient les opérations du web service.
                        </p>
                        <p>
                            -
                            <i>
                                <b>nom_du_WSProxy.java</b>
                            </i>
                            : Un proxy client qui implémente l'interface précédente et donc les opérations du web service. Lors de son initialisation il fait appelle au
                            <i>ServiceLocator</i>
                            pour obtenir l'accés au service et à ses opérations
                        </p>
                        <p>
                            -
                            <i>
                                <b>nom_du_WSService.java</b>
                            </i>
                            et
                            <i>
                                <b>nom_du_WSServiceLocator.java</b>
                            </i>
                            : Une interface et sont implémentation qui sont crées à partir de la balise
                            <i>service</i>
                            du fichier WSDL. Le
                            <b>ServiceLocator</b>
                            récupère l'addresse du web service ( le
                            <b>endpoint</b>
                            )présent dans le wsdl, et le passe à une instance de la classe
                            <i>nom_du_WSSoapBindingStub.java</i>
                            ce qui va lui permettre de communiquer avec le web service.
                        </p>
                        <p>
                            -
                            <i>
                                <b>nom_du_WSSoapBindingStub.java</b>
                            </i>
                            : une implémentation de l'interface
                            <i>nom_du_WS.java</i>
                            qui hérite de la classe
                            <i>Stub</i>
                            du serveur Axis. En utilisant différentes classe du Serveur Axis, c'est elle qui va permettre la transformation des méthodes du web service en requêtes SOAP et ainsi de communiquer avec l'application distante.
                        </p>
                        <p>
                            <b>Note :</b>
                            <a href="http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL" target="_about">Documentation du WSDL2Java d'Axis ( pour mieux comprendre l'utilisation coté client, mais voir aussi le coté serveur ).</a>
                        </p>
                        <p>
                            <b>Utilisation du Web-Serivice :</b>
                        </p>
                        <p>
                            Il ne reste plus qu'à crée une classe
                            <i>Launcher.java</i>
                            dans laquelle on va appeller les deux opérations du web service :
                        </p>
                        <textarea name="code" class="java">package launcher;
							import java.rmi.RemoteException;
							import javax.xml.rpc.ServiceException;
							import services.MathServices;
							import services.MathServicesServiceLocator;
							public class Launch {
							public static void main(String[] args) {
							//load the web service
							// constructor without parameters load from default adress localhost on port 8080
							MathServicesServiceLocator locator = new MathServicesServiceLocator();
							try {
							// call the service
							MathServices myMathService = locator.getMathServices();
							int resultSquare  = myMathService.toSquare(3);
							int resultCube = myMathService.toCube(2);
							// display the results
							System.out.println(resultSquare);
							System.out.println(resultCube);
							} catch (ServiceException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							} catch (RemoteException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							}</textarea>
                        <p>
                            <i>
                                <b>Explications du code :</b>
                            </i>
                        </p>
                        <p>
                            - On récupère une instance de
                            <b>MathServicesLocator</b>
                            .
                        </p>
                        <p>
                            - Cette instance récupère l'addresse par défaut du web service :
                            <b>http://localhost:8080/WebServiceTest2/services/MathServices</b>
                        </p>
                        <p>
                            - La méthode
                            <b>locator.getMathServices()</b>
                            récupère une instance de
                            <b>MathServices</b>
                            via la classe
                            <b>MathServicesSoapBindingStub</b>
                            . L'instance
                            <b>myMathService</b>
                            peut donc communiquer via le protocole SOAP.
                        </p>
                        <p>
                            - Les méthodes
                            <b>toSquare</b>
                            et
                            <b>toCube</b>
                            vont faire les requêtes SOAP nécessaire au serveur AXIS pour obtenir les résultats.
                        </p>
                        <img src="./images/resultClass.png" />
                        <p>
                            <i>Résultat de l'appel de toSquare(3) et toCube(2).</i>
                        </p>
                        <h4>Création d'un client JSP</h4>
                        <p>
                            On commence par créer un nouveau projet web dynamique ( ici nommé
                            <i>WebServiceClientJSP</i>
                            .
                        </p>
                        <p>
                            De la même façon que pour le client JAVA, on Copie/Colle le fichier .wsdl du web service voulu (ici, MathServices.wsdl) dans le répertoire
                            <i>src</i>
                            du nouveau projet puis
                            <b>Clic droit &gt; Web Services &gt; Create Client.</b>
                        </p>
                        <p>
                            On arrive ensuite à la fenêtre de création du client, seule différence avec le client JAVA, on monte le curseur jusqu'à
                            <b>Test Client</b>
                            (encadré en rouge). Eclispe va ainsi créer les classes et interfaces (cf. client JAVA / WSDL2Java) mais aussi les scripts JSP d'une application Web de test :
                        </p>
                        <img src="./images/createClientJSP.png" />
                        <p>
                            <i>
                                Le curseur est bien tout en haut sur
                                <b>Test client</b>
                                .
                            </i>
                        </p>
                        <img src="./images/arboClientJSP.png" />
                        <p>
                            <i>
                                Les classes et interfaces dans le package
                                <b>services</b>
                                , les scripts JSP dans le dossier
                                <b>WebContent</b>
                                .
                            </i>
                        </p>
                        <p>
                            L'application test comporte trois frames,
                            <b>Methods</b>
                            , qui contient toutes les opérations disponibles pour le web service ;
                            <b>Inputs</b>
                            , qui permet de passer des paramètres à l'opération choisie et
                            <b>Result</b>
                            qui affiche le retour de l'opération.
                        </p>
                        <img src="./images/clientJSP.png" />
                        <p>
                            <i>Application client test en JSP.</i>
                        </p>
                        <p>
                            Le script qui nous interesse est
                            <b>result.jsp</b>
                            car c'est lui qui lance la requête SOAP et récupère la réponse, en voici un extrait :
                        </p>
                        <p>
                            <b>Explication du code :</b>
                        </p>
                        <p>
                            - On utilise le taglib
                            <b>useBean</b>
                            pour récupérer l'instance
                            <b>sampleMathServicesProxyid</b>
                            de la classe
                            <b>MathServicesProxy</b>
                            valable pour toute la session.
                        </p>
                        <p>- l'instance, dès son initialisation et grace au ServiceLocator, peut accéder aux opérations du web service.</p>
                        <p>
                            - les balises
                            <b>scriplet</b>
                            permettent d'appeler les méthodes comme on l'a fait pour le client JAVA avec les paramère transmis par la frame
                            <b>Inputs</b>
                            .
                        </p>
                        <p>- il suffit ensuite d'afficher le résultat stocké dans une variable.</p>
                        <img src="./images/resultJSPextract.png" />
                        <p>
                            <i>
                                Extrait de
                                <b>result.jsp</b>
                                .
                            </i>
                        </p>
                    </div>
                    <!-- Fin du sous chapitre consommer un WS -->
                </div>
                <!-- Fin du chapitre création avec eclipse -->
                <div class="chapter">
                    <h2>Annexe : Autres technologies autour des web-services</h2>
                    <div class="subChapter">
                        <h3>Liens vers les ressources pour aller plus loin :</h3>
                        <h4>Inter-opérabilité des services entre JAVA et Windows Communication Foundation :</h4>
                        <img src="./images/duke_tango.jpg" />
                        <p>
                            -
                            <a href="https://wsit.dev.java.net/" target="_about">WSIT : Web Services Interoperability Technologies (projet Tango)</a>
                        </p>
                        <p>
                            -
                            <a href="http://java.sun.com/developer/technicalArticles/glassfish/ProjectTango/" target="_about">Projet Tango de chez Sun (article technique).</a>
                        </p>
                        <h4>Framework et outils :</h4>
                        <p>
                            -
                            <a href="http://ws.apache.org/wsif/" target="_about">Web Service Invocation Framework (WSIF) d'Apache.</a>
                        </p>
                        <p>
                            -
                            <a href="http://ws.apache.org/juddi/" target="_about">JDDI : implémentation Java de UDDI d'apache.</a>
                        </p>
                    </div>
                    <!-- fin de sous chapitre pour aller plus loin -->
                </div>
                <!-- fin de Annexe -->
                <p />
                <div class="quote">
                    Désolé pour le jeu de mot entre SOAP et web service !! :)
                    <div class="quote_author">Yohann</div>
                </div>
            </div>
        </div>
    </body>
</html>

